﻿//========================================================= 
/**@file lmdb_extractor.cpp
 * @brief lmdb_extractor.h接口实现
 * 
 * @date 2018-06-06   15:55:45
 * @author Zhyioo 
 * @version 1.0
 */ 
//--------------------------------------------------------- 
#ifndef _LIBZHOUYB_LMDB_EXTRACTOR_CPP_
#define _LIBZHOUYB_LMDB_EXTRACTOR_CPP_
//--------------------------------------------------------- 
#include "lmdb_extractor.h"
//--------------------------------------------------------- 
namespace zhou_yb {
namespace wrapper {
namespace lmdb_extractor {
//--------------------------------------------------------- 
const mdb_mode_t lmdb_env::default_mdb_mode = 0664;
const uint lmdb_env::default_flags = 0;
const uint lmdb_env::default_dbs = 256;
const MDB_dbi lmdb_env::Mdb_NULL = 0;
//--------------------------------------------------------- 
lmdb_txn lmdb_env::begin(uint flags, MDB_txn* parent) const
{
    lmdb_txn txn;
    txn._begin(*this, flags, parent);
    return txn;
}
lmdb_const_txn lmdb_const_env::begin(uint flags, MDB_txn* parent) const
{
    lmdb_const_txn txn;
    txn._begin(*this, flags | MDB_RDONLY, parent);
    return txn;
}
//--------------------------------------------------------- 
lmdb_dbi lmdb_txn::open(const char* name, uint flags)
{
    lmdb_dbi dbi;
    if(!_is_empty_or_null(name))
        flags |= MDB_CREATE;
    // 需要重新设置 MAXDBS
    if(!dbi._open(*this, name, flags) && dbi.error() == MDB_DBS_FULL)
    {
        lmdb_env env = lmdb_env::create(_env, lmdb_env::default_dbs);
        lmdb_txn txn = env.begin(_flags, _parent);
        if(!txn.is_valid())
            return dbi;
        if(dbi._open(txn, name, flags))
        {
            (*this) = txn;
        }
    }
    return dbi;
}
lmdb_const_dbi lmdb_const_txn::open(const char* name, uint flags)
{
    flags &= ~MDB_CREATE;

    lmdb_const_dbi dbi;
    // 需要重新设置 MAXDBS
    if(!dbi._open(*this, name, flags) && dbi.error() == MDB_DBS_FULL)
    {
        lmdb_const_env env = lmdb_env::create(_env, lmdb_env::default_dbs);
        lmdb_const_txn txn = env.begin(_flags, _parent);
        if(!txn.is_valid())
            return dbi;
        if(dbi._open(txn, name, flags))
        {
            (*this) = txn;
        }
    }
    return dbi;
}
//--------------------------------------------------------- 
lmdb_cursor lmdb_dbi::cursor() const
{
    lmdb_cursor cursor;
    cursor._open(*this);
    return cursor;
}
lmdb_const_cursor lmdb_const_dbi::cursor() const
{
    lmdb_const_cursor cursor;
    cursor._open(*this);
    return cursor;
}
//--------------------------------------------------------- 
} // namespace lmdb_extractor 
} // namespace wrapper
} // namespace zhou_yb 
//--------------------------------------------------------- 
#endif // _LIBZHOUYB_LMDB_EXTRACTOR_CPP_
//========================================================= 